home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / checkbox / lib / template_i18n.py < prev    next >
Encoding:
Python Source  |  2009-04-27  |  4.4 KB  |  134 lines

  1. #
  2. # This file is part of Checkbox.
  3. #
  4. # Copyright 2008 Canonical Ltd.
  5. #
  6. # Checkbox is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # Checkbox is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import re
  20. import locale
  21.  
  22. from os import environ
  23. from gettext import gettext as _
  24.  
  25. from checkbox.lib.template import Template
  26.  
  27.  
  28. class TemplateI18n(Template):
  29.  
  30.     def __init__(self, *args, **kwargs):
  31.         super(TemplateI18n, self).__init__(*args, **kwargs)
  32.  
  33.         self._languages = self._get_languages()
  34.  
  35.     def _add_modifier(self, language, modifier):
  36.         return "%s.%s" % (language, modifier)
  37.  
  38.     def _add_territory(self, language, territory):
  39.         return re.sub(r"([^_@.]+)", "\\1%s" % territory, language)
  40.  
  41.     def _add_charset(self, language, charset):
  42.         return re.sub(r"([^@.]+)", "\\1%s" % charset, language)
  43.  
  44.     def _merge_lists(self, primaries, secondaries):
  45.         for primary, secondary in zip(primaries, secondaries):
  46.             yield primary
  47.             yield secondary
  48.  
  49.     def _get_language_list(self, language):
  50.         regex = re.compile(r"(@[^.]+)")
  51.         modifier_match = regex.search(language)
  52.         language = regex.sub("", language)
  53.  
  54.         language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language)
  55.         if not language_match:
  56.             raise Exception, "Unknown language format: %s" % language
  57.  
  58.         ret = [language_match.group(1)]
  59.         if modifier_match:
  60.             modifier = modifier_match.group(1)
  61.             modifiers = [self._add_modifier(r, modifier) for r in ret]
  62.             ret = self._merge_lists(modifiers, ret)
  63.  
  64.         if language_match.group(2):
  65.             territory = language_match.group(2)
  66.             territories = [self._add_territory(r, territory) for r in ret]
  67.             ret = self._merge_lists(territories, ret)
  68.  
  69.         if language_match.group(3):
  70.             charset = language_match.group(3)
  71.             charsets = [self._add_charset(r, charset) for r in ret]
  72.             ret = self._merge_lists(charsets, ret)
  73.  
  74.         return ret
  75.  
  76.     def _get_languages(self):
  77.         languages = []
  78.         if environ.has_key("LANGUAGE") and environ["LANGUAGE"]:
  79.             for language in environ["LANGUAGE"].split(":"):
  80.                 languages.extend(self._get_language_list(language))
  81.  
  82.         language = locale.setlocale(locale.LC_MESSAGES)
  83.         languages.extend(self._get_language_list(language))
  84.  
  85.         return [l.lower() for l in languages]
  86.  
  87.     def _filter_field(self, field):
  88.         lines = []
  89.         separator = "\n\n"
  90.         for line in field.split(separator):
  91.             lines.append(_(line))
  92.  
  93.         return separator.join(lines)
  94.  
  95.     def _filter_languages(self, element):
  96.         filter = {}
  97.         basekeys = {}
  98.         for key in element.keys():
  99.             basekey = re.sub(r"^_?([^-]+).*$", "\\1", key)
  100.             basekeys[basekey] = None
  101.  
  102.         for key in basekeys.keys():
  103.             if self._languages:
  104.                 for language in self._languages:
  105.                     field = "%s-%s" % (key, language)
  106.                     if field in element:
  107.                         filter[key] = element[field]
  108.                         break
  109.                 if key in filter:
  110.                     continue
  111.             else:
  112.                 field = "%s-c" % key
  113.                 if field in element:
  114.                     filter[key] = element[field]
  115.                     continue
  116.  
  117.             if key in element:
  118.                 filter[key] = self._filter_field(element[key])
  119.                 continue
  120.             else:
  121.                 field = "_%s" % key
  122.                 if field in element:
  123.                     filter[key] = self._filter_field(element[field])
  124.                     continue
  125.  
  126.             raise Exception, "No language found for key: %s" % key
  127.  
  128.         return filter
  129.  
  130.     def load_file(self, *args, **kwargs):
  131.         elements = super(TemplateI18n, self).load_file(*args, **kwargs)
  132.  
  133.         return [self._filter_languages(e) for e in elements]
  134.